package com.netty.demo.client.demo.netty;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.net.InetSocketAddress;

/**
 * 客户端请求服务端的对象
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——-----——+
 * | 包头          | 模块号        | 命令号      |  长度        |   数据       |
 * +——----——+——-----——+——----——+——----——+——-----——+
 * 协议开始标志 HEAD，为int类型的数据，16进制表示为0X110
 * 传输数据的长度  length int类型
 * java 数据类型对应字节
 * byte     1字节
 * short    2字节
 * int      4字节
 * long     8字节
 * char     2字节
 * float    4字节
 * double   8字节
 * boolean  false/true (理论上占用1bit,1/8字节，实际处理按1byte处理)
 * ByteBuf  的read 操作是会改变索引
 * 读取和规定格式不一样,会读串数据.
 * 按照规定的数据协议读取数据 如果在规定的协议中，有大端字节和小端字节的问题
 * 把  in.readShort() 改为 readShortLE()
 * Byte   Long  读取方式同上   改为带LE的方法即可
 *
 * @author 余秀良
 * @version 1.0
 * <p>date: 2019年09月09日  14:39 </p>
 * <p>address: 四川成都 </p>
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
@ToString
public class RequestProtocol {
    /**
     * TODO 分隔符不确定，当前为测试用
     */
    public static final byte SEPARATOR = (byte) ':';
    /**
     * TODO 不确定，当前为测试用
     * 协议开始
     */
    private int head;
    /**
     * 长度
     */
    private int length;
    /**
     * 会话id
     */
    private long messageId;
    /**
     * 消息类型
     */
    private byte type;
    /**
     * 请求模块
     */
    private short module;
    /**
     * 命令号
     */
    private short cmd;
    /**
     * 时间
     */
    private long time;

    /**
     * 数据部分
     */
    private byte[] data;
    /**
     * 来源地址  用于回消息用
     */
    private InetSocketAddress sourceAddress;

    public RequestProtocol(final int head, final int length, final long messageId, final byte type, final short module, final short cmd, long time, final byte[] data) {
        this.head = head;
        this.length = length;
        this.messageId = messageId;
        this.type = type;
        this.module = module;
        this.cmd = cmd;
        this.time = time;
        this.data = data.clone();
    }

    public int getHead() {
        return head;
    }

    public void setHead(int head) {
        this.head = head;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public long getMessageId() {
        return messageId;
    }

    public void setMessageId(long messageId) {
        this.messageId = messageId;
    }

    public byte getType() {
        return type;
    }

    public void setType(byte type) {
        this.type = type;
    }

    public short getModule() {
        return module;
    }

    public void setModule(short module) {
        this.module = module;
    }

    public short getCmd() {
        return cmd;
    }

    public void setCmd(short cmd) {
        this.cmd = cmd;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public byte[] getData() {
        return data != null ? data.clone() : null;
    }

    public void setData(byte[] data) {
        this.data = data != null ? data.clone() : null;
    }

    public InetSocketAddress getSourceAddress() {
        return sourceAddress;
    }

    public void setSourceAddress(InetSocketAddress sourceAddress) {
        this.sourceAddress = sourceAddress;
    }
}
